<html>
<head>
<title>user_03</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style>
pre {
	font-family: "Courier New", Courier, monospace;
}
</style>
</head>
<body>

<h2>到处移动</h2>

<p>
在你能插入或删除文字之前你必须先把光标移动到正确的位置。Vim有大量的命令可以定位光标。本章教你一些最常用的。
</p>

<h3>3.1 按字移动</h3>

<p>
要向前移动一个字符，使用w命令。像大多数Vim命令，你可以使用一个数字前缀最为倍数。例如，3w移动三个字。下面这个图显示了它是如何工作的：
<pre>
    This is a line with example text
    |----'--'-'-----------------'
         w  w w                3w
</pre>
注意:如果光标已经在一个字的开头，w会把光标移动到下一个字的开头。b命令移动到前一个字的开头：
<pre>
    This is a line with example text
    '----'--'-'---------'-------|
    b    b  b 2b        b
</pre>
还有一个e命令移动到下一个自的结尾，ge移动到上一个字的结尾：
<pre>
    This is a line with example text
       '--'-|----'----'
      ge ge      e    e
</pre>
如果你在一行的最后一个字上，使用w可以把你带到下一行的开头。这样你可以很快地跑完整个段落，要比l快很多。b可以在相反的方向上完成同样的工作。
</p>

<div style="border: solid 1px red;">
TODO:如何定义一个字？abc$#@$@def ll-abc $#@$@ de2f ab_cd
<ul>
<li>所有非空白字符构成的连续字符串是一个大字。</li>
<li>所有字母、数字、下划线构成的连续字符串是一个字母小字。</li>
<li>所有字母、数字、下划线、空白字符之外的字符构成的字符串是一个符号小字。</li>
<li>空白字符用于分割字。</li>
<li>字母小字和符号小字相互分割。</li>
</ul>
</div>

<p>
<pre>
           ge     b             w                        e
           '|     '|     |------'                     |--'
    This is-a line, with special/separated/words (and some#more )
       '----| '----|     |-----------------------'    |-------'
       gE     B                                  W            E
</pre>
使用这些命令：w e b W E B，你可以在段落中快速移动。
</p>

<h3>3.2 移动到一行的开头和结尾</h3>

<p>
$命令把光标移到一行的末尾。如果你的键盘有&lt;End&gt;键，其功能是一样的。
</p>

<p>
^命令把光标移动到一行的第一个非空白字符。0命令把光标移动到一行的第一个字符，&lt;Home&gt;的功能和0一行。如下图：
<pre>
          ^
          '---------|
    ......This is a line with example text
    '---------------|--------------------'
    0                                    $
    （......表示空白字符）
</pre>
</p>

<p>
和其它移动命令一样，$可以指定倍数。但是移动到同一行的末尾好几次是没有意义的。所以，它会使得光标移动到另外一行的末尾。例如，1$移动到第一行的末尾（当前所在行）,2$移动到第二行的末尾，以此类推。
</p>

<p>
0命令不接受倍数参数，因为0本身就会是倍数的一部分。令人意外的是，对^使用倍数也是没有效果的。
</p>

<h3>3.3 移动到一个字符</h3>

<p>
很有用的一个移动命令之一是单个字符搜索命令。fx命令在一行中向前搜索单个字符x。提示：f表示find。
</p>

<p>
例如，你在如下行的最开头。假设你想移动到human的h字母上。只需要使用fh，光标就会移动到h上面：
<pre>
    To err is human. To really foul up you need a computer.
    |---------'--------------'
             fh             fy
</pre>
这个例子也显示了fy可以移动到really的末尾。 你也可以指定倍数，这样你能到达foul的l上：
<pre>
    To err is human. To really foul up you need a computer.
    |-----------------------------'
                                3fl
</pre>
F命令向左搜索：
<pre>
    To err is human. To really foul up you need a computer.
              '-------------------|
              Fh
</pre>
</p>

<p>
tx命令和fx命令差不多，不过它在匹配字符的前一个字符上停下来。提示：t表示to。其反向版本是T。
<pre>
    To err is human. To really foul up you need a computer.
               '------------------|-------'
               Th                        tn
</pre>
这四个命令都可以用;命令重复。,命令在相反的方向上重复。但是光标永远不会跨到另外一行上面取，哪怕所在的句子跨行了。
</p>

<p>
有时候你发起了搜索命令，突然意识到命令按错了。比如你按了f，其实你是想用F。要放弃搜索，按&lt;Esc&gt;。注意：&lt;Esc&gt;可以放弃大多数命令，而不仅是搜索。
</p>

<h3>3.4 匹配括号</h3>

<p>
你写程序的时候，经常遇到嵌套的()结构。于是%命令就非常有用：把光标移动到匹配的括号上。这对[]和{}也是有效的。（这些可以通过matchpairs选项定义。）如果光标所在字符不是一个括号，系统会向前搜索找到一个，然后再匹配。
</p>

<h3>3.5 移动到特定的行</h3>

<p>
如果你是c或c++程序员，你会很熟悉下面的错误：
<pre>
    prog.c:33: j  undeclared(first use in this function)
</pre>
这是在告诉你，你或许想要修改第33行。那么你如果找到第33行呢？一种方法是先来个999k保证到了第一行，然后再32j到达第33行。虽然这个方法不是很好，单很有效。但一种更好的方法是使用G命令。使用倍数，该命令能够让你到达指定的行号。例如33G把你带到第33行。（其实有更好的方法遍历编译错误列表，更多信息间:make命令）
</p>

<p>
没有参数G会把你带到最后一行。gg会把你带到第一行，1G一行。
</p>

<p>
另一种移动到行的方法是带参数的%命令。例如50%把你带到文件的中部。90%把你带到文件的接近尾部。
</p>

<p>
前面都是假设你想移动到任意一行，而不管那一行是否在屏幕上可见。如果你想移动到你所看到的行，该怎么做呢？H表示Home，移动到屏幕第一行；M表示Middle，移动到屏幕的中部；L表示Last，移动屏幕的最后一行。
</p>

<h3>3.6 显示你在哪儿</h3>

<p>
想知道你在文件什么位置：有三种方式：
</p>
 	x
<ol>
<li>
使用CTRL-G命令。你会得到一行信息，会显示你所编辑的文件名称，你所在的行号，文件总行数，当前行所处的位置百分比，以及所在列。有时候你会看到分割的列号，例如2-9，那是因为有时候字符号并不等于列号，这里2表示第二个字符，9表示第九列。
</li>
<li>
使用number选项。
</li>
<li>
使用ruler选项。
</li>
</ol>

<h3>3.7 卷屏</h3>

</body>
</html>
